package com.scholarship.common.config;

import com.scholarship.modules.admin.mapper.ARewardFeedbackMapper;
import com.scholarship.modules.admin.mapper.AUserInfoMapper;
import com.scholarship.modules.backend.service.RewardTableService;
import com.scholarship.modules.backend.service.RewardTimeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.transaction.annotation.Transactional;

import java.util.Calendar;
import java.util.Date;

/**
 * @author zhz
 * @date 2021/10/14 16:57
 * 备注：参考https://www.cnblogs.com/wdzhz/p/13306891.html
 */
@Slf4j
@Configuration      //1.主要用于标记配置类，兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class ScheduleTask {
    @Autowired
    RewardTableService rewardTableService;

    @Autowired
    RewardTimeService rewardTimeService;

    @Autowired
    private ARewardFeedbackMapper aRewardFeedbackMapper;

    @Autowired
    private AUserInfoMapper aUserInfoMapper;
    //3.添加定时任务

    /**
     * Cron表达式参数分别表示：
     *
     * 秒（0~59） 例如0/5表示每5秒
     * 分（0~59）
     * 时（0~23）
     * 日（0~31）的某天，需计算
     * 月（0~11）
     * 周几（ 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT）
     * econds (秒) ：可以用数字0－59 表示
     * Minutes(分) ：可以用数字0－59 表示
     * Hours(时) ：可以用数字0-23表示
     * Day-of-Month(天) ：可以用数字1-31 中的任一一个值，但要注意一些特别的月份
     * Month(月) ：可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
     * Day-of-Week(每周)：可以用数字1-7表示（1 ＝ 星期日）或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
     * “/”：为特别单位，表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次，“3”表示从第3分钟开始执行
     * “?”：表示每月的某一天，或第周的某一天
     * “L”：用于每月，或每周，表示为每月的最后一天，或每个月的最后星期几如“6L”表示“每月的最后一个星期五”
     * “W”：表示为最近工作日，如“15W”放在每月（day-of-month）字段上表示为“到本月15日最近的工作日”
     * ““#”：是用来指定“的”每月第n个工作日,例 在每周（day-of-week）这个字段中内容为”6#3” or “FRI#3” 则表示“每月第三个星期五”
     */
    @Scheduled(cron = "0 */5 * * * ?")
    //或直接指定时间间隔，例如：5秒
    //@Scheduled(fixedRate=5000)
    @Transactional(rollbackFor=Exception.class)//事务的注解，失败就rollback
    public void configureTasks() throws Exception {
        //如果现在的时间是在奖学金提交结束之后，则更新分数
        if(new Date().after(rewardTimeService.getRewardTime().getSubmitEndTime())){
            //rewardTableService.upStuScore();
            //获取导入年份
            Calendar calendar = Calendar.getInstance();
            String importYear = String.valueOf(calendar.get(Calendar.YEAR));
            //更新总申请状态
            aRewardFeedbackMapper.updateStatesByBarringApplicationState(importYear,3,1);
            //更新已申请奖学金学生的总成绩
            aUserInfoMapper.updateTotalScore();
            //进行三选二的判断，扣去三项中的最低分
            rewardTableService.threeChoiceeTwo();
            //更新总排名
            aUserInfoMapper.updateTotalRank();
            log.info("执行定时任务:更新分数、更新总申请状态");
        }
    }
}